package 尚硅谷多线程2;

import java.util.concurrent.locks.ReentrantLock;

/*
* 解决线程安全问题的方式三，Lock锁---JDK5.0新增
* 面试题：
* 1.synchronized和lock的异同？
* 相同：二者都可以解决线程安全问题
* 不同：synchronized机制再执行完相应的同步代码以后，自动释放同步监视器
*      lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock())
* 2.优先使用顺序
*    lock-->同步代码块(已经进入了方法体，分配了相应资源)-->同步方法（再方法体之外 ）
* 2.面试题：如何解决线程安全问题，有几种方式
*
* */
class Window implements Runnable{
    // 实例化ReentrantLock
    //默认时false，自由竞争
    //加入true代表锁的公平竞争(按照顺序依次执行)
   // private ReentrantLock lock=new ReentrantLock(true);

    private ReentrantLock lock=new ReentrantLock(true);
    private int ticket = 100;
    @Override
    public void run() {
        while(true){
            try {
                //2.调用lock() 上锁
                lock.lock();
                if (ticket>0){
                    System.out.println(Thread.currentThread().getName()+"卖票 庙号"+ticket);
                    --ticket;
                }else break;
            }finally {
                //3.解锁 调用unlock()
                lock.unlock();
            }

        }
    }
}

public class LockTest {
    public static void main(String[] args) {
        Window window=new Window();
        Thread thread1=new Thread(window);
        Thread thread2=new Thread(window);
        Thread thread3=new Thread(window);
        thread1.setName("线程一");thread2.setName("线程二"); thread3.setName("线程三");
        thread1.start();thread2.start();thread3.start();

    }

}
